/*
 * Copyright (C) 2015 truth
 *
 * This program is non-free software, but you can redistribute it and/or modify
 * it if you are in hjj(Huangshi Hejianjiao) team.
 */
package com.truthbean.jutils.dao.apache;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 使用 commons-dbutils jar 包内的方法
 * @param <T>
 * @since Jan 15, 2015 11:20:28 AM
 * @author TruthBean
 */
public interface BaseDao<T> {
	
    /**
     * 执行 非查询操作, 包括 INSERT(但没有返回值)、UPDATE、DELETE
     * @param sql: 待执行的 SQL 语句
     * @param args: 填充占位符的可变参数
     * @return 返回的是一个对象
     * @throws SQLException 
     */
    public int update(String sql, Object... args);

    /**
     * 执行单条记录的查询操作, 返回与记录对应的类的一个对象
     * @param sql: 待执行的 SQL 语句
     * @param args: 填充占位符的可变参数
     * @return
     * @throws SQLException 
     */
    public T query(String sql, Object... args);

    /**
     * 执行多条记录的查询操作, 返回与记录对应的类的 List集合
     * @param sql: 待执行的 SQL 语句
     * @param args: 填充占位符的可变参数
     * @return
     * @throws SQLException 
     */
    public List<T> queryForList(String sql, Object... args);
    
    /**
     * 执行单个属性或值的查询操作 例如查询某一条记录的某个字段, 或查询某个统计结果, 返回要查询的内容
     * @param <V>
     * @param sql
     * @param args
     * @return
     * @throws SQLException 
     */
    public <V> V getSingleVal(String sql, Object... args);
    
    /**
     * 执行两个属性或值的查询操作，返回Map对象
     * @param sql
     * @param args
     * @return Map对象
     */
    public Map<?, ?> getValForMap(String sql, Object... args);
    
    /**
     * 执行多个个属性或值的查询操作 例如查询某一条记录的某个字段, 或查询某个统计结果, 返回要查询的值的List对象
     * @param sql
     * @param args
     * @return List对象
     */
    public <V> List<V> getValForList(String sql, Object... args);
    
    /**
     * 执行多个个属性或值的查询操作 例如查询某一条记录的某个字段, 或查询某个统计结果, 返回要查询的值的Set对象
     * @param sql
     * @param args
     * @return Set对象
     */
    public <V> Set<V> getValForSet(String sql, Object... args);
    
    /**
     * 执行批量更新操作
     *
     * @param sql: 待执行的 SQL 语句
     * @param args: 填充占位符的可变参数
     * @return 
     * @throws SQLException 
     */
    public int[] batch(String sql, Object[][] args);
    
}
